上一章節講解到 array 的使用,文章中有提到 array 使用上是實值類型以及在 array 長度不可變的(限制長度),間接的限制了使用場景
所以今天要討論的是 slice 切片,也是 Golang 對 array 在進行一層的封裝
切片是一個擁有相同類型元素的可變長度的序列,可以非常靈活運用,自動擴容
切片是引用類型 內部結構當中包含 pointer len cap 。 使用方便且快速操作數據集合
var variabel_name [] Type
package main
import (
"fmt"
)
func main() {
var a []string //聲明一個字串切片
var b = []int{}
var c = []bool{false, true}
fmt.Println(a)
fmt.Println(b) //[]
fmt.Println(c) //[flase ture]
fmt.Println(a == nil) //true
}
切片擁有自己的長度和容量
可以使用 len() 查看長度
可以使用 cap() 查看容量
package main
import "fmt"
func main() {
a := [7]int{55, 75, 58, 60, 66, 84, 10}
b := a[1:4] //基於arra a創建切片,包含a[1],a[2],a[3]
fmt.Println(b)
fmt.Printf("type of b: %T \n", b)
fmt.Printf("len %d\n", len(b)) //長度為3 是指元素的個數
fmt.Printf("cap %d\n", cap(b)) //切片容量最底層從切片第一元素到最後
}
package main
import "fmt"
func main() {
s1 := make([]int, 5, 10) //創建長度5 容量10的 切片
fmt.Printf("s1 = %v len(s1) = %d cap(s1) = %d", s1, len(s1), cap(s1))
}
使用 append() 來對 slice 進行操作
來達成自動擴容效果
package main
import "fmt"
func main() {
s1 := make([]int, 2, 2) //創建長度0 容量2的 切片
fmt.Printf("長度 %d 容量 %d\n", len(s1), cap(s1))
fmt.Printf("指標為 %p\n", s1)
//使用 append 對 s1 增加元素2
s1 = append(s1, 2)
fmt.Printf("s1 = %v \n", s1)
//容量自動擴容至 4
fmt.Printf("長度 %d 容量 %d ", len(s1), cap(s1))
fmt.Printf("擴容後 pointer = %p 改變\n", s1)
s1 = append(s1, 2, 7, 8, 10)
fmt.Printf("s1 = %v\n", s1)
fmt.Printf("長度 %d 容量 %d\n", len(s1), cap(s1))
var b = []int{5, 89, 156, 10}
//將 b 切片 與 s1 進行合併
s1 = append(s1, b...)
fmt.Printf("s1 = %v\n", s1)
fmt.Printf("長度 %d 容量 %d\n", len(s1), cap(s1))
}
操作兩個slice 藉由複製至目標
package main
import (
"fmt"
)
func main() {
var source []int = []int{1, 2, 3, 4, 5}
var target = make([]int, 10)
fmt.Println(target)
copy(target, source )
fmt.Println(target)
}